package gzip;

import java.io.*;
import java.util.*;
import java.util.zip.*;
/**
 * 程序实现了ZIP压缩。共分为2部分 ：
 * 压缩（compression）与解压（decompression）
 * <p>
 * 大致功能包括用了多态，递归等JAVA核心技术，可以对单个文件和任意级联文件夹进行压缩和解压。
 * 需在代码中自定义源输入路径和目标输出路径。
 * <p>
 * 在本段代码中，实现的是解压部分；压缩部分见本包中compression部分。
 * @author HAN
 *
 */
public class CopyOfMyzipDecompressing {
	
	public static void main(String[] args) {
		unZip("E:\\AA打包文件夹\\users(1).zip", "E:\\AA打包文件夹\\5");
		
	}
	
	public static void unZip(String srcFile, String destFolder) {
		long startTime=System.currentTimeMillis();
		try {
			ZipInputStream zIn=new ZipInputStream(new FileInputStream(srcFile));//输入源zip路径
			BufferedInputStream bIn=new BufferedInputStream(zIn);
			File file = null;
			ZipEntry entry;
			try {
				while((entry = zIn.getNextEntry())!=null ){
					file=new File(destFolder,entry.getName());
					if(entry.isDirectory()) {
						file.mkdirs();
					} else {
						if(file.exists()){
							(new File(file.getParent())).mkdirs();
						}
						BufferedOutputStream bOut=new BufferedOutputStream(new FileOutputStream(file));
						int b;
						while((b=bIn.read())!=-1){
							bOut.write(b);
						}
						bOut.close();
					}
				}
				System.out.println(file+"解压成功");	
				bIn.close();
				zIn.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long endTime=System.currentTimeMillis();
		System.out.println("耗费时间： "+(endTime-startTime)+" ms");
	}
	
	 /**
     * 解压缩ZIP文件，将ZIP文件里的内容解压到targetDIR目录下
     * @param zipName 待解压缩的ZIP文件名
     * @param targetBaseDirName  目标目录
     */
    public static List<File> upzipFile(String zipPath, String descDir) {
        return upzipFile( new File(zipPath) , descDir ) ;
    }
    
    /**
     * 对.zip文件进行解压缩
     * @param zipFile  解压缩文件
     * @param descDir  压缩的目标地址，如：D:\\测试 或 /mnt/d/测试
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static List<File> upzipFile(File zipFile, String descDir) {
        List<File> _list = new ArrayList<File>() ;
        try {
            @SuppressWarnings("resource")
			ZipFile _zipFile = new ZipFile(zipFile) ;
            for( Enumeration entries = _zipFile.entries() ; entries.hasMoreElements() ; ){
                ZipEntry entry = (ZipEntry)entries.nextElement() ;
                File _file = new File(descDir + File.separator + entry.getName()) ;
                if( entry.isDirectory() ){
                    _file.mkdirs() ;
                }else{
                    File _parent = _file.getParentFile() ;
                    if( !_parent.exists() ){
                        _parent.mkdirs() ;
                    }
                    InputStream _in = _zipFile.getInputStream(entry);
                    OutputStream _out = new FileOutputStream(_file) ;
                    int len = 0 ;
                    while( (len = _in.read(_byte)) > 0){
                        _out.write(_byte, 0, len);
                    }
                    _in.close(); 
                    _out.flush();
                    _out.close();
                    _list.add(_file) ;
                }
            }
        } catch (IOException e) {
        }
        return _list ;
    }
    private static byte[] _byte = new byte[1024] ;
}
